from django.contrib.auth.models import User
from django.shortcuts import render

# Create your views here.
from django_filters.rest_framework import DjangoFilterBackend

from rest_framework import viewsets

# 视图集,是用来处理模型的增删改查,
from rest_framework.filters import OrderingFilter
from rest_framework.pagination import PageNumberPagination
from rest_framework.permissions import \
    AllowAny, IsAdminUser, IsAuthenticated, \
    IsAuthenticatedOrReadOnly, BasePermission

# AllowAny 允许所有人
# IsAuthenticatedOrReadOnly   允许认证用户读写, 未认证时只能执行 安全请求(GET, HEAD, OPTIONS)

# IsAuthenticated  允许认证用户
# IsAdminUser  允许职员用户
# superuer  超级用户


from app_book.models import BookInfo, HeroInfo
from app_book.serializers import BookInfoSerializer, HeroInfoSerializer, UserSerializer


# 自定义分页器 局部
class PageNum(PageNumberPagination):
    # /?page=1  => 进行分页, 取第一页,
    page_size_query_param = 'page_size'  # 如果你写了  /?page_size=5  =>  每页5条
    page_size = 2  # 每页2个


# 自定义权限类, 需要继承 BasePermission
class MyPermission(BasePermission):
    def has_permission(self, request, view):
        # request,  view
        # print(view)  # view 是视图集
        # print(view.action)
        """判断用户对模型有没有访问权"""
        if request.user.is_superuser:
            # 管理员对用户模型有访问权
            return True
        elif view.kwargs.get('pk') == str(request.user.id):
            # 携带的id和用户的id相同时有访问权
            return True
        return False


# 1. 写用户视图集
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    permission_classes = (MyPermission,)  # 谁来处理权限认证的事情


# 2. 自定义权限类, 来控制获取用户信息
# 3. 只能获取自己的信息, 不能获取别人的信息.


class BookViewSet(viewsets.ModelViewSet):
    """
    完成书籍的增删改查
    """
    queryset = BookInfo.objects.all()  # 视图集可以处理的数据
    serializer_class = BookInfoSerializer  # 处理数据的工具

    # 自定义权限类
    permission_classes = (IsAuthenticated,)  # 谁来处理权限认证的事情

    # 指定顾虑的处理器, 哪个方法来处理过滤这个事情
    # 指定过滤方法类, 排序方法类, 一个或多个
    # from django_filters.rest_framework import DjangoFilterBackend
    # from rest_framework.filters import OrderingFilter
    filter_backends = (DjangoFilterBackend, OrderingFilter)  # 同时支持过滤和排序

    # 可以排序的字段有哪些, 指定排序字段, 不设置, 排序功能不起效
    ordering_fields = ('id', 'bpub_date')

    # 可以过滤的字段指定过滤字段, 不设置, 过滤功能不起效
    """
    btitle = models.CharField(max_length=20, verbose_name='名称')
    bpub_date = models.DateField(verbose_name='发布日期')
    bread = models.IntegerField(default=0, verbose_name='阅读量')
    bcomment = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    """
    filter_fields = ('btitle', 'is_delete')

    # 自定义分页器 覆盖全局配置
    pagination_class = PageNum


class HeroViewSet(viewsets.ModelViewSet):
    """
    完成英雄的增删改查
    """
    queryset = HeroInfo.objects.all()  # 视图集可以处理的数据
    serializer_class = HeroInfoSerializer  # 处理数据的工具
